package htw.queue;
import htw.list.*;
import htw.exceptions.*;


/**
 * Beschreiben Sie hier die Klasse StudentQueue.
 * 
 * @author Andreas Dier, Steffen Schuhmann 
 * @version 0.2
 */
public class Queue 
{
    private List liste;

    /** 
     * Liste erzeugen 
     */
    public Queue() {
        liste = new htw.list.List();        
    }

    /** 
     * Element am Ende der Liste anhaengen   
     *
     * @param o einzufuegendes Element
     * @exception NoListException falls liste null ist
     * @exception AlreadyInListException falls es das Object schon gibt
     */
    public void add(Object o) throws NoListException, AlreadyInListException {
        if( liste == null )
            throw new NoListException("Liste wurde noch nicht angelegt");
        
        int position;
        
        position = liste.indexOf(o);
        
        if( position == -1)
        {
            liste.addLast(o);
        }
        else
        {
            throw new AlreadyInListException("Object schon vorhanden in der Liste");
        }
    }

    /** 
     * Komplette Liste loeschen        
     */
    public void clear() {
        //this();
    }

    /** 
     * Enthaelt die Liste den Studenten
     *
     * @param o einzufuegendes Element
     * @return true, falls das Object in der Liste vorkommt, false sonst
     * @exception NoListException falls liste null ist
     */
    public boolean contains(Object o) throws NoListException {
        if( liste == null )
            throw new NoListException("Liste wurde noch nicht angelegt");
        return liste.contains(o);
    }


    /** 
     * Object an der Stelle index zurueckgeben 
     * 
     * @param index Der Index dessen zugehoeriges Objekt zurueckzugeben ist (0 <= index < size)
     * @return der gefundene Object
     * @exception NoListException falls liste null ist
     */
    public Object get(int index) throws NoListException {
        if( liste == null )
            throw new NoListException("Liste wurde noch nicht angelegt");
            
        return liste.get( index);
    }

    /** 
     * Das erste Element zurueckgeben 
     * 
     * @return das erste Object
     */
    public Object getFirst() {   
        return liste.getFirst();
    }

    /** 
     * Das letzte Element zurueckgeben 
     * 
     * @return den letzten Studenten
     */
    public Object getLast() {
        return liste.getLast();
    }

    /** 
     * An welcher Stelle steht das Object     
     * @param o der zusuchende Object
     * @return den Index des Studenten oder -1
     */
    public int indexOf(Object o) {
        return liste.indexOf(o);
     }

    /**
     * Das erste Element loeschen
     * @exception NoListException falls liste null ist
     */
    public void remove() throws NoListException {
        if( liste == null )
            throw new NoListException("Liste wurde noch nicht angelegt");
        
        liste.removeLast();
    }

    /**
     * @return Anzahl der Elemente
     */
    public int size() {
        return liste.size();
    }
    
    /**
     * @return Queue als zeichenkette
     */
    public String toString() {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < liste.size(); i++ ) 
             sb.append(" -> ").append(liste.get(i)); 
        return sb.toString();
    }
}